package com.ccc.scala.base7_collection

object Collection16_Practice {

  def main(args: Array[String]): Unit = {
    // 练习
    // 不同省份的商品点击排行
    val datas = List(
      ("zhangsan", "河北", "鞋"),
      ("lisi", "河北", "衣服"),
      ("wangwu", "河北", "鞋"),
      ("zhangsan", "河南", "鞋"),
      ("lisi", "河南", "衣服"),
      ("wangwu", "河南", "鞋"),
      ("zhangsan", "河南", "鞋"),
      ("lisi", "河北", "衣服"),
      ("wangwu", "河北", "鞋"),
      ("zhangsan", "河北", "鞋"),
      ("lisi", "河北", "衣服"),
      ("wangwu", "河北", "帽子"),
      ("zhangsan", "河南", "鞋"),
      ("lisi", "河南", "衣服"),
      ("wangwu", "河南", "帽子"),
      ("zhangsan", "河南", "鞋"),
      ("lisi", "河北", "衣服"),
      ("wangwu", "河北", "帽子"),
      ("lisi", "河北", "衣服"),
      ("wangwu", "河北", "电脑"),
      ("zhangsan", "河南", "鞋"),
      ("lisi", "河南", "衣服"),
      ("wangwu", "河南", "电脑"),
      ("zhangsan", "河南", "电脑"),
      ("lisi", "河北", "衣服"),
      ("wangwu", "河北", "帽子")
    )

    // 转换成：(省份-商品, 1)
    val listTuples = datas.map(
      tuple => (tuple._2 + "-" + tuple._3, 1)
    )

    // 转换结构后的数据进行分组
    val groupDatas = listTuples.groupBy(
      tuple => tuple._1
    )

    // 分组后的数据作统计聚合
    val cntDatas = groupDatas.mapValues(
      list => list.size
    )

    // 切分 省份-商品的字符串
    val cntDatas2 = cntDatas.map(
      tuple => {
        val strs = tuple._1.split("-")
        (strs(0), strs(1), tuple._2)
      }
    )

    // 因为前面得到的是一个Map，进行GroupBy的时候会一直覆盖，所以要转List再做groupBy
    // 按照地区分组 得到每个地区每个商品的销量
    val groupDatas2 = cntDatas2.toList.groupBy(
      t => t._1
    )

    // 丢弃Map中value的省份，顺便做一个最后的排序
    val result = groupDatas2.mapValues(
      list => {
        list.map(
          tuple => {
            (tuple._2, tuple._3)
          }
        ).sortBy(t => t._2)(Ordering.Int.reverse)
      }
    )

    println(result)


  }

}
